/*
 * AbstractGenerator.h
 *
 *  Created on: 2011-03-04
 *      Author: Jagger
 */

#ifndef __ABSTRACTGENERATOR_H__
#define __ABSTRACTGENERATOR_H__

#include <omnetpp.h>
#include "NetPacket_m.h"

/**
 * Abstrakcyjna klasa definiujaca sposob dzialania generatorow ruchu sieciowego.
 */
class AbstractGenerator : public cSimpleModule
{
	/**
	 * Wewnetrzny komunikat wykorzystywany do planowania czasow w ktorych
	 * generator tworzy pakiety sieciowe.
	 */
	cMessage*	intervalEvent;
	/**
	 * Sygnal wykorzystywany do generowania statystyk.
	 */
	simsignal_t	intervalSignal;

protected:
	/**
	 * Informuje ile pakietow zostalo wygenerowanych do tej pory w calej sieci
	 * (we wszystkich istniejacych generatorach).
	 */
	static int totalNumGenerated;

	/**
	 * Wartosc informujaca ile pakietow zostalo wygenerowanych do tej pory.
	 */
	int 		numGenerated;
	/**
	 * Czas symulacyjny od ktorego generator moze dopiero wysylac pakiety.
	 */
	simtime_t 	startTime;
	/**
	 * Czas symulacyjny do ktorego generator moze wysylac pakiety.
	 * Ustawiony na 0 oznacza, ze generator nie ma ograniczenia czasowego i
	 * symulacja trwa do momentu jej zatrzymania przez uzytkownika.
	 */
	simtime_t 	endTime;
	/**
	 * Kwant czasu w jakim taktuje zegar generatora. Moze, ale nie musi skalowac
	 * intensywnosc ruchu.
	 */
	simtime_t	tick;

	/**
	 * Iniciuje atrybuty tego generatora. Klasy dziedziczace, chcace nadpisac te
	 * metode, musza pamietac o wywolaniu tej metody w nadklasie. Wewnetrznie
	 * wywoluje metode 'getNextPacketArrivalTime'.
	 */
	virtual void initialize();
	/**
	 * Wysyla nowy pakiet oraz planuje czas wyslania kolejnego, o ile czas
	 * symulacyjny nie przekroczyl czasu 'endTime'.
	 */
	virtual void handleMessage(cMessage* msg);

	/**
	 * Metoda pomocnicza tworzaca nowy pakiet sieciowy.
	 * Wewnetrznie inkrementuje wartosc 'numGenerated'.
	 */
	virtual NetPacket* createPacket();
	/**
	 * Abstrakcyjna metoda ktora klasy dziedziczace musza implementowac.
	 * Zwraca czas symulacyjny w ktorym ma zostac wygenerowany kolejny pakiet
	 * sieciowy. Czas ten nie moze byc mniejszy od czasu przekazanego w
	 * argumencie 'lastPacketArrival', symoblizujacym czas przyjscia ostatnio
	 * wygenerowanego pakietu.
	 */
	virtual simtime_t getNextPacketArrivalTime(simtime_t lastPacketArrival) = 0;

	/**
	 * Metoda sprawdzajaca czy generator moze w danym czasie generowac
	 * komunikaty.
	 */
	bool canGenerate(simtime_t time) const;
};

#endif
